﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using ThiagoSoftware.Dados;
using System.Data.SqlClient;
using GerTestes.Entity;

namespace GerTestes.Data
{
    public class DBUsuarios
    {
        #region Get Usuários
        public DataTable getUsuarios(string pUserName)
        {
            string SQL = @"SELECT tu.ID_USUARIO,
                                   tu.NOME,
                                   tu.EMAIL,
                                   tu.FOTO,
                                   tu.SITUACAO,
                                   tu.ID_NIVEL,            
                                   ar.RoleName AS FUNCAO
                            FROM   TB_USUARIOS tu
                                   JOIN aspnet_Users au
                                        ON  au.UserName = tu.NOME
                                   JOIN aspnet_UsersInRoles auir
                                        ON  auir.UserId = au.UserId
                                   JOIN aspnet_Roles ar
                                        ON  ar.RoleId = auir.RoleId";
            if (pUserName != string.Empty)
                SQL += " WHERE tu.NOME LIKE @USERNAME + '%'";
            SQL += " ORDER BY tu.NOME";
            DataAccess db = new DataAccess(SQL);
            if (pUserName != string.Empty)
                db.AddParam("@USERNAME", SqlDbType.VarChar, pUserName);
            return db.GetDataTable();
        }
        #endregion

        #region Get Dados Usuário
        public Usuario getDadosUsuario(int pCodigoUser)
        {
            string SQL = @"SELECT tu.ID_USUARIO,
                                   tu.NOME,
                                   tu.EMAIL,
                                   tu.FOTO,
                                   tu.SITUACAO,
                                   tu.ID_NIVEL,            
                                   ar.RoleName AS FUNCAO
                            FROM   TB_USUARIOS tu
                                   JOIN aspnet_Users au
                                        ON  au.UserName = tu.NOME
                                   JOIN aspnet_UsersInRoles auir
                                        ON  auir.UserId = au.UserId
                                   JOIN aspnet_Roles ar
                                        ON  ar.RoleId = auir.RoleId
                            WHERE tu.ID_USUARIO = @ID_USUARIO";
            DataAccess db = new DataAccess(SQL);
            db.AddParam("@ID_USUARIO", SqlDbType.Int, pCodigoUser);
            try
            {
                db.AbrirConexao();
                SqlDataReader dr = db.ExecuteReader();
                Usuario usuario = new Usuario();
                if (dr.Read())
                {
                    usuario.Codigo = pCodigoUser;
                    usuario.Nome = dr["NOME"].ToString();
                    usuario.Email = dr["EMAIL"].ToString();
                    usuario.Situacao = dr["SITUACAO"].ToString();
                    if (dr["ID_NIVEL"] != null)
                        usuario.IdNivel = Convert.ToInt32(dr["ID_NIVEL"].ToString());
                    if (dr["FUNCAO"] != null)
                        usuario.Funcao = dr["FUNCAO"].ToString();
                    if (dr["FOTO"].ToString() != string.Empty)
                        usuario.Imagem = (byte[])dr["FOTO"];
                }
                return usuario;
            }
            catch
            {
                return null;
            }
        }
        #endregion

        #region Get Dados Usuário
        public Usuario getDadosUsuario(string pUserName)
        {
            string SQL = @"SELECT tu.ID_USUARIO,
                                   tu.NOME,
                                   tu.EMAIL,
                                   tu.FOTO,
                                   tu.ID_NIVEL,
                                   tu.SITUACAO,
                                   ar.RoleName AS FUNCAO
                            FROM   TB_USUARIOS tu
                                   JOIN aspnet_Users au
                                        ON  au.UserName = tu.NOME
                                   JOIN aspnet_UsersInRoles auir
                                        ON  auir.UserId = au.UserId
                                   JOIN aspnet_Roles ar
                                        ON  ar.RoleId = auir.RoleId
                            WHERE tu.NOME = @USERNAME";
            DataAccess db = new DataAccess(SQL);
            db.AddParam("@USERNAME", SqlDbType.VarChar, pUserName);
            try
            {
                db.AbrirConexao();
                SqlDataReader dr = db.ExecuteReader();
                Usuario usuario = new Usuario();
                if (dr.Read())
                {
                    usuario.Codigo = Convert.ToInt32(dr["ID_USUARIO"].ToString());
                    usuario.Nome = dr["NOME"].ToString();
                    usuario.Email = dr["EMAIL"].ToString();
                    usuario.Situacao = dr["SITUACAO"].ToString();
                    if (dr["ID_NIVEL"] != null)
                        usuario.IdNivel = Convert.ToInt32(dr["ID_NIVEL"].ToString());
                    if (dr["FUNCAO"] != null)
                        usuario.Funcao = dr["FUNCAO"].ToString();
                    if (dr["FOTO"] != null)
                        usuario.Imagem = (byte[])dr["FOTO"];
                }
                return usuario;
            }
            catch
            {
                return null;
            }
        }
        #endregion

        #region Inserir Usuário
        public bool inserirUsuario(Usuario usu, string pRegra)
        {
            string sql = "";
            DataAccess db = new DataAccess(sql);
            SqlTransaction transacao;
            db.AbrirConexao();
            transacao = db.BeginTransaction();
            try
            {
                db.Command.Transaction = transacao;
                #region Inserir Usuário
                string SQL = @"INSERT INTO TB_USUARIOS
                                  ( ";
                if (usu.Imagem != null)
                    SQL += " FOTO,";
                SQL += @" NOME,
                         EMAIL,
                         SITUACAO,
                         ID_NIVEL
                         )
                         VALUES
                         (";
                if (usu.Imagem != null)
                    SQL += " @FOTO,";
                SQL += @" @NOME,
                          @EMAIL,                                    
                          'A',
                          @ID_NIVEL
                          )";
                db.Command.CommandText = SQL;
                db.AddParam("@NOME", SqlDbType.VarChar, usu.Nome);
                db.AddParam("@EMAIL", SqlDbType.VarChar, usu.Email);
                if (usu.Imagem != null)
                    db.AddParam("@FOTO", SqlDbType.VarBinary, usu.Imagem);
                db.AddParam("@ID_NIVEL", SqlDbType.Int, usu.IdNivel);
                #endregion
                if (!db.Transacao())
                    throw new Exception();


                db.Command.Parameters.Clear();

                if (!ThiagoSoftware.Seguranca.Usuario.CriarUsuario(usu.Nome, "gertestes123", usu.Email))
                    throw new System.Exception();
                string[] usuarios = new string[1];
                usuarios[0] = usu.Nome;
                if (!ThiagoSoftware.Seguranca.Regras.AddUsuariosRegra(usuarios, pRegra))
                    throw new System.Exception();

                string corpo = string.Format(@"<html>
                                                <head>
                                                    <title>GerTestes</title>
                                                </head>
                                                <body style='font-family:Verdana; font-size:10pt;'>
                                                    <b>Portal de Serviços - GerTestes</b><br />
                                                    <p>O GerTestes recebeu a sua solicitação de criação de usuário.</p>
                                                    <p>Abaixo segue os dados de acesso.</p>
                                                    <br />
                                                    <p>Usuário:&nbsp;&nbsp;<b>{0}</b><br />Senha:&nbsp;&nbsp;<b>gertestes123</b></p>                                                    
                                                    <br />
                                                    <br />                                                    
                                                </body>
                                                </html>", usu.Nome);

                ThiagoSoftware.IO.Suporte.EnviarEmail(usu.Email, "Acesso Usuário - Plataforma GerTestes", corpo, string.Empty);
                    //throw new System.Exception();

                transacao.Commit();
                return true;
            }
            catch (System.Exception ex)
            {
                ThiagoSoftware.Seguranca.Usuario.ExcluirUsuario(usu.Nome);
                transacao.Rollback();
                throw new System.Exception(ex.Message.ToString());
            }
            finally
            {
                db.FecharConexao();
            }
        }
        #endregion

        #region Alterar Usuário
        public bool alterarUsuario(Usuario usu)
        {
            string SQL = @"UPDATE TB_USUARIOS
                            SET ";
            if (usu.Imagem != null)
                SQL += " FOTO   = @FOTO, ";
            SQL += @"    ID_NIVEL  = @ID_NIVEL,
                         EMAIL     = @EMAIL                                   
                      WHERE  ID_USUARIO  = @ID_USUARIO";
            DataAccess db = new DataAccess(SQL);
            db.AddParam("@ID_NIVEL", SqlDbType.Int, usu.IdNivel);
            db.AddParam("@EMAIL", SqlDbType.VarChar, usu.Email);
            if (usu.Imagem != null)
                db.AddParam("@FOTO", SqlDbType.VarBinary, usu.Imagem);
            db.AddParam("@ID_USUARIO", SqlDbType.Int, usu.Codigo);
            return db.ExecuteNonQuery();
        }
        #endregion

        #region Excluir Usuário
        public bool excluirUsuario(Usuario usuario)
        {
            string sql = "";
            DataAccess db = new DataAccess(sql);
            SqlTransaction transacao;
            db.AbrirConexao();
            transacao = db.BeginTransaction();
            try
            {
                db.Command.Transaction = transacao;
                #region Excluir Usuário
                string SQL = @"DELETE FROM TB_USUARIOS
                            WHERE ID_USUARIO = @ID_USUARIO";
                db.Command.CommandText = SQL;
                db.AddParam("@ID_USUARIO", SqlDbType.VarChar, usuario.Codigo);

                #endregion
                if (!db.Transacao())
                    throw new Exception();

                db.Command.Parameters.Clear();

                if (!ThiagoSoftware.Seguranca.Usuario.ExcluirUsuario(usuario.Nome))
                    throw new System.Exception();

                transacao.Commit();
                return true;
            }
            catch (System.Exception ex)
            {
                transacao.Rollback();
                throw new System.Exception(ex.Message.ToString());
            }
            finally
            {
                db.FecharConexao();
            }
        }
        #endregion
    }
}
